XS (Perl)

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

XS (от англ. «eXternal Subroutine») — это макроязык интерфейса внешних функций языка программирования Perl, через который программа на языке Perl может вызывать подпрограмму на C или C++.

Макроязык XS описывает интерфейс функций и служит для согласования модели вызова Perl-функций с моделью вызова C-функций, что включает в себя преобразование типов и манипуляции с размещением аргументов функций и возвращаемых значений. Каждую отдельно описанную функцию в интерфейсе принято называть XSUB.

XS используется в тех случаях, когда требуется сделать обёртку или интерфейс к существующим C-библиотекам для использования в Perl.

Описание[править | править код]

В программировании на Perl интерфейс между Perl и другими языками также называется расширением. Популярным языком интерфейса, используемым в программировании на Perl, является XS. Язык XS используется в файле описания интерфейса для создания расширенного интерфейса между Perl и кодом на C или C++. Интерфейс XS компонуется с некоторыми библиотеками для создания новой библиотеки, которая может быть либо динамически, либо статически связана с Perl. Описание интерфейса пишется на макроязыке XS и является ключевым компонентом интерфейса расширения Perl.[1]

XSUB формирует основную единицу для интерфейса XS и представляет собой прямой перевод между C/C++ и Perl, поэтому он сохраняет интерфейс. После того, как интерфейс XSUB скомпилирован с использованием компилятора xsubpp, он обеспечивает прямое сопоставление между кодом Perl и C и "склеивает" их вместе.[1]

История появления[править | править код]

Библиотеки подпрограмм в Perl называются модулями, а модули, содержащие XSUB, называются модулями XS. Perl предоставляет основу для разработки, упаковки, распространения и установки таких модулей.

Появление XS вызвано необходимостью написания подпрограмм, которые выполняют задачи с очень интенсивным использованием ЦП и/или оперативной памяти, взаимодействуют с оборудованием или низкоуровневыми системными средствами, существующими библиотеками подпрограмм на C.

Обёртки[править | править код]

Можно писать модули XS, которые обертывают код C++. В основном это вопрос настройки системы сборки модулей[2].

Пример создания XS-модуля[править | править код]

Ниже показан XS-модуль, который предоставляет функцию concat() для объединения двух строк (то есть эквивалентная оператору Perl .).

#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

SV* _do_sv_catsv (pTHX_ SV* one_sv, SV* two_sv ) {
    SV* one_copy = newSVsv(one_sv);
    sv_catsv(one_copy, two_sv);
    return one_copy;
}
MODULE = Demo::XSModule      PACKAGE = Demo::XSModule

SV*
concat (SV* one_sv, SV* two_sv)
    CODE:
        SV* to_return = _do_sv_catsv( aTHX_ one_sv, two_sv );
        RETVAL = to_return;

    OUTPUT:
        RETVAL

Первые четыре строки (операторы #define и #include) являются стандартным шаблоном.

После этого следует любое количество простых функций C, которые вызываются локально.

Секция, которая начинается с MODULE = Demo::XSModule, определяет интерфейс Perl для этого кода, используя фактический язык макросов XS. Обратите внимание, что код C в секции CODE: вызывает функцию чистого C _do_sv_catsv(), которая была определена в предыдущей секции.

Документация Perl объясняет значение и назначение всех «специальных» символов (например, aTHX_ и RETVAL), показанных выше.

Чтобы сделать этот модуль доступным для Perl, его необходимо скомпилировать. Инструменты сборки, такие как ExtUtils::MakeMaker, могут делать это автоматически. (Для сборки вручную: инструмент xsubpp анализирует модуль XS и выводит исходный код C; этот исходный код затем компилируется в общую библиотеку и помещается в каталог, где Perl может его найти.) Код Perl затем использует для загрузки и компиляции XS-модуля XSLoader. На этом этапе Perl может вызвать Demo::XSModule::concat('foo', 'bar') и получить обратно результат в виде строки foobar, как если бы concat() сам был написан на Perl.

Обратите внимание, что для создания интерфейсов Perl к уже существующим С-библиотекам, инструмент h2xs может автоматизировать большую часть создания самого файла XS.

Сложности[править | править код]

Создание и сопровождение модулей XS требует опыта работы с самим C, а также с обширным C API Perl. Модули XS могут быть установлены только в том случае, если доступны компилятор C и файлы заголовков, с которыми был скомпилирован интерпретатор Perl. Кроме того, новые версии Perl могут нарушить бинарную совместимость, требуя перекомпиляции модулей XS.

См. также[править | править код]

  • SWIG — альтернатива XS, которая также поддерживает вызов функций C и C++ из нескольких других языков.
  • FFI — механизм, который позволяет вызывать подпрограммы, написанные на другом языке.

Примечания[править | править код]

  1. 1 2 Ying Bai, 2003.
  2. Gluing C++ And Perl Together. johnkeiser.com (27 августа 2001). Дата обращения: 15 сентября 2021. Архивировано из оригинала 11 декабря 2001 года.

Литература[править | править код]

  • Jenness, Tim & Cozens, Simon (2002). «Extending and Embedding Perl». Greenwich: Manning Publications Co. ISBN 1-930110-82-0
  • Ying Bai. Interfaces Between Perl and ANSI C, Visual C++ // Applications Interface Programming Using Multiple Languages: A Windows® Programmer's Guide. — Pearson, 2003. — 864 с.

Ссылки[править | править код]